package com.snail.service.serviceImp;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import com.snail.mapper.BizProductMapper;
import com.snail.model.pojo.mall.BizProduct;
import com.snail.result.Result;
import com.snail.service.IBizProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BizProductServiceImpl extends ServiceImpl<BizProductMapper, BizProduct> implements IBizProductService {
    @Override
    public boolean decreaseStock(Long productId) {
        // 使用MyBatis-Plus的UpdateWrapper
        UpdateWrapper<BizProduct> updateWrapper = new UpdateWrapper<>();
        updateWrapper.setSql("stock = stock - 1")
                .eq("product_id", productId)
                .gt("stock", 0); // 确保库存大于0

        return this.update(updateWrapper);
    }

    @Override
    public List<BizProduct> listUndeleteProducts() {
        // 构建查询条件：只查询deleted=0的商品 还有库存大于0
        LambdaQueryWrapper<BizProduct> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(BizProduct::getDeleted, 0)
                .gt(BizProduct::getStock, 0);

        // 调用父类方法查询（基于BaseMapper的selectList）
        return baseMapper.selectList(queryWrapper);
    }


    @Override
    public Result<?> addProduct(BizProduct product) {
        // 1. 业务校验（示例：名称非空）
        if (product.getProductName() == null || product.getProductName().trim().isEmpty()) {
            return Result.failed("商品名称不能为空");
        }

        // 2. 保存商品（MyBatis-Plus 自动处理 createTime/updateTime/deleted）
        boolean success = save(product);
        return success ? Result.success("商品添加成功") : Result.failed("商品添加失败");
    }

    @Override
    public Result<?> updateProduct(BizProduct product) {
        // 1. 业务校验（示例：ID必须存在）
        if (product.getProductId() == null) {
            return Result.failed("商品ID不能为空");
        }

        // 2. 更新商品（MyBatis-Plus 自动处理 updateTime）
        boolean success = updateById(product);

        return success ? Result.success("商品修改成功") : Result.failed("商品修改失败");
    }

    @Override
    public Result<?> deleteProduct(Integer productId) {
        // 1. 校验ID
        if (productId == null) {
            return Result.failed("商品ID不能为空");
        }

        // 2. 逻辑删除（MyBatis-Plus 自动将 deleted 设为 1）
        boolean success = removeById(productId);
        return success ? Result.success("商品删除成功") : Result.failed("商品删除失败");
    }

    @Override
    public BizProduct selectById(Integer productId) {
        BizProduct bizProduct = baseMapper.selectById(productId);
        return bizProduct;
    }


    @Override
    public List<BizProduct> getProductWithSpecs(Integer productId) {
        // 调用 Mapper 自定义方法
        return baseMapper.selectProductWithSpecs(productId);
    }

    @Override
    public List<BizProduct> listBySellerUserId(Integer sellerUserId) {
        return baseMapper.selectList(
                new LambdaQueryWrapper<BizProduct>()
                        .eq(BizProduct::getSellerUserId, sellerUserId)
        );
    }
    @Override
    public Result<?> decreaseStock(Integer productId, Integer quantity) {


        if (productId == null || quantity == null || quantity <= 0) {
            return Result.failed("参数错误");
        }

        try {
            // 查询当前库存
            BizProduct product = getById(productId);
            if (product == null) {
                return Result.failed("商品不存在");
            }

            if (product.getStock() < quantity) {
                return Result.failed("库存不足");
            }

            // 使用乐观锁方式扣减库存
            UpdateWrapper<BizProduct> updateWrapper = new UpdateWrapper<>();
            updateWrapper.setSql("stock = stock - " + quantity)
                    .eq("product_id", productId)
                    .ge("stock", quantity); // 确保库存足够

            boolean success = update(updateWrapper);

            if (success) {
                // 更新销量
                UpdateWrapper<BizProduct> saleUpdateWrapper = new UpdateWrapper<>();
                saleUpdateWrapper.setSql("sale = sale + " + quantity)
                        .eq("product_id", productId);
                update(saleUpdateWrapper);

                return Result.success("库存扣减成功");
            } else {
                return Result.failed("库存扣减失败，可能库存不足");
            }
        } catch (Exception e) {
            log.error("扣减库存失败", e);
            return Result.failed("库存扣减失败");
        }
    }
    // 在 BizProductServiceImpl.java 中添加以下方法
    @Override
    public Result<?> increaseStock(Integer productId, Integer quantity) {
        if (productId == null || quantity == null || quantity <= 0) {
            return Result.failed("参数错误");
        }

        try {
            // 使用乐观锁方式增加库存
            UpdateWrapper<BizProduct> updateWrapper = new UpdateWrapper<>();
            updateWrapper.setSql("stock = stock + " + quantity)
                    .eq("product_id", productId);

            boolean success = update(updateWrapper);

            if (success) {
                System.out.println("成功增加商品 {productId} 库存 {quantity} 件" );
                return Result.success("库存增加成功");
            } else {
                return Result.failed("库存增加失败");
            }
        } catch (Exception e) {
            log.error("增加库存失败", e);
            return Result.failed("库存增加失败");
        }
    }
}
